package com.hanfb.mall.inventory.thread;

import com.hanfb.mall.inventory.request.ProductInventoryCacheReloadRequest;
import com.hanfb.mall.inventory.request.ProductInventoryDbUpdateRequest;
import com.hanfb.mall.inventory.request.Request;
import com.hanfb.mall.inventory.request.RequestQueue;

import java.util.Map;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Callable;

/**
 * @作者： Hanfb
 * @描述：
 * @时间： 2020年10月09日
 */
public class RequestProcessorThread implements Callable<Boolean> {


    private ArrayBlockingQueue<Request> queue;

    public RequestProcessorThread(ArrayBlockingQueue<Request> queue) {
        this.queue = queue;
    }


    @Override
    public Boolean call() throws Exception {
        try {
            while (true) {
                //ArrayBlockingQueue
                //blocking 就是说 如果队列满了 或者是空的  都会在这里阻塞住
                Request request = queue.take();
                System.out.println("===========日志============：工作线程处理请求，商品id="+request.getProductId());
                boolean forceRefresh = request.isForceRefresh();

                if (!forceRefresh) {
                    RequestQueue requestQueue = RequestQueue.getInstance();
                    Map<Integer, Boolean> flagMap = requestQueue.getFlagMap();

                    if (request instanceof ProductInventoryDbUpdateRequest) {
                        //如果是一个更新数据库的请求  那么就将这个 productId 对应的表示设置为 true
                        flagMap.put(request.getProductId(), true);
                    } else if (request instanceof ProductInventoryCacheReloadRequest) {
                        //如果是缓存刷新的请求 那么就判断 如果标识不为空 且是true  那么就说明之前有一个商品的更新请求
                        Boolean flag = flagMap.get(request.getProductId());
                        if (flag != null && flag) {
                            flagMap.put(request.getProductId(), false);
                        }
                        //如果是刷新缓存的请求  且 发现标识不为空 但标识 fasle
                        //说明前面已经有一个数据库更新请求和一个缓存刷新请求
                        if (flag != null && !flag) {
                            //对于这种请求 直接就过滤掉  不放入后面的内存队列中去了
                            return true;
                        }
                        if (flag == null) {
                            flagMap.put(request.getProductId(), false);
                        }
                    }

                }
                System.out.println("===========日志============：工作线程处理请求，商品id =" + request.getProductId());
                request.executeProcess();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }
}
